[iOS] Burp Suiteを使用した、SSL通信のデバッグ
1 はじめに
Burp Suiteは、Webの脆弱性診断を行う製品です。 XSSや、その他の脆弱性であるreflectedやstoredのDOMベースの検査パターンを有しています。
今回は、この製品の機能のうちの一つである、「プロキシー機能」を使用して、iPhoneからのSSL通信をモニターする要領を紹介します。 なお、「プロキシー機能」だけであれば、無料で提供されている「Free Edition」でも利用が可能です。
通信を行うアプリを作成する場合、サーバとの間の通信を見れると、非常に作業効率が上がると思います。 HTTP通信であれば、パケットモニター(Wiresharkなど)で簡単に見ることが出来ますが、HTTPSの通信は、通信が暗号化されているため、通常のパケットモニタでは、その内容を確認することは出来ません。
2 MITM
はじめに、Burp Suiteが、SSL通信をモニターする方法と、通常のSSL通信との違いを整理して事後の作業の手助けとします。
次の図は、通常のSSL通信(図中のA)と、MITM(ここではBurp Suite)を経由した通信(図中のC)の違いを示したものです。
赤色の部分が平文で、青色が暗号化されている部分です。SSL通信で暗号化できるのは、エンドポイントまでなので、中間で平文化してモニターするためには、エンドポイントを改めて形成する必要があります。
また、SSL通信では、サーバ証明書が必要ですが、MITMでは、自前で用意した証明書を使用しています。
Burp Suiteでは、クライアントのプロキシー設定を変更して、自分宛に通信を向けさせますが、通常のプロキシーサーバ(図中のB)は、暗号化したままのパケットを橋渡しするだけなので、そのURLさえ見ることはできません。
図を見れば分かるように、本来の通信と違っているのは、クライアントがSSL通信で使用しているサーバ証明書だけですので、そこをクリアする必要があることが分かります。
本物のサーバ証明書と、偽物の証明書を見分ける対策は、Public Key Pinningとして存在しており、この対策を実装したアプリ(Chromeなど)では、このBurp Suiteによるモニターはできません。
3 インストール
(1) ダウンロード
下記のページから、Downloadのリンクを辿ります。
https://portswigger.net/index.html
Free WditionのDownlocad nowを選択すると無料のバージョンが取得できます。
(2) 実行
Burp Suiteは、1.6以降のJavaがインストールされている必要があります。
$Java -version java version "1.8.0_66" Java(TM) SE Runtime Environment (build 1.8.0_66-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
コマンドラインから、下記の要領で起動することができます。 (ヒープにMAX2GBを指定して、JVMを起動しています。)
$ java -jar -Xmx2G burpsuite_free_v1.6.32.jar
4 表示設定
設定により、次の2つのフォント設定が可能です。
(1) メニュー・タブキャプション・ボタン等
メニュー等のフォントは、Option - Display - User Interfaceで設定できます。 再起動後に、設定が反映されます。
(2) テキスト
テキストのフォントは、Option - Display - HTTP Message Display - Change font...で設定できます。 こちらは、再起動は必要なく、ただちに反映されます。
5 プロキシーリスナー
Proxy - Option - Proxy Listenersで、プロキシーとして待受けるインターフェースとポートを指定します。
デフォルトで、ローカルアドレスからの8080ポートしか受け付けないようになっていますので、それ以外からの通信を受け付ける場合は、Addボタンで追加する必要があります。
下記は、あらゆるインターフェースからの8080番を待ち受けに追加している様子です。
6 クライアントのプロキシー設定
ここまでの設定で、クライアント(iPhone)のプロキシー設定を、サーバ(Burp Suiteのアドレス)、ポート(8080)に設定することで、通信をモニタできます。
Proxy - HTTP historyをページを開くと、とりあえず通信がモニタできていることを確認できます。
※現時点では、SSL通信はモニター出来ません。
7 インターセプト
Burp Suiteでは、クライアントからの通信を受けた際に、一旦止めて、編集等してから、サーバに送信する機能があります。
Proxy - Interceptのページで、intercepy onになっていたら、通信が止まっていますので、流すためには、intercept offにしてください。
8 証明書
(1) 2種類の証明書
最初の図で示したように、Burp Suiteは、自分自身を接続先のサーバに見せかけるために、サーバ証明書を自前で用意します。そして、その証明書は、まず、自己の中にルート証明書を持ち、そこから、ホスト毎に証明書を発行して使用しています。
ここで、クライアントであるiPhoneは、SSL通信する場合に、そのサーバ証明書を信頼する必要があるのですが、その方法には、次の2つがあります。
- ホスト毎にサーバ証明書を信頼する
- Burp Suiteのルート証明書を信頼する
最初を方法をとる場合、ホストが変わるたびに、毎回、証明書の信頼を行う必要が有りますが、2つ目の方法をとった場合、1回ルート証明書を信頼すれば、それに基づいて発行される証明書は、自動的に全部信頼することになります。
(2) 個別のサーバ証明書の信頼
最初の方法をとる場合、iPhoneでSSL通信した際、次の画面が表示されます。
そして、この画面から、「詳細」を選択し、続いて「信頼」を選択することで、この証明書を信頼したことになります。
(3) ルート証明書の信頼
ルート証明書を信頼するには、まず、クライアントで、Burp Suiteのアドレス+ポート(例では、http://192.168.0.105:8080/)にアクセスします。すると次のような画面が表示されますので、ここでCA certificateを選択します。 (この作業は、Safariで行います)
すると、次のような画面になりますので、「インストール」を選択して進めると、そのルート証明書を信頼します。
インストールされた、ルート証明書は、「設定」ー「一般」ー「プロファイル」で確認できます。また同メニューで削除することも出来ます。
ルート証明書を信頼すると、それを元に発行した証明書は、全て黙って信頼してしまうので、このような「オレオレ証明書」のインストールは、慎重に行ってください。作業が終わったら、確実に削除することをお勧めします。
9 ATS
Burp SuiteでiOS9のアプリの通信をモニターしようとすると、ATSの制限に抵触する可能性があります。
ATSについての詳しい情報は、下記をご参照ください。
[iOS 9] iOS 9 で追加された App Transport Security の概要
ATSは、Info.plistで、その設定を無効にすることまで含めて、自由に変更可能ですが、デフォルト値で、幾つかの制限があります。そして、これに対応するためには、Burp Suiteで設定を確認する必要があります。
(1) TLSバージョン及び暗号スイート
iOS9のATSでは、デフォルトで、TLSバージョン 1.2 以上が要求されます。また、暗号スイートの組み合わせも、下記の組み合わせに制限されています。
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
この制限に対応するため、Burp Suiteでは、Option** - SSL のタブで、その設定を確認する必要があります。
(2) 証明書
証明書については、デフォルトで、2048ビット以上のRSAキー、もしくは、256ビット以上のECCキーが要求されますが、ドキュメントによるとBurp Suiteでは、当初1024ビットの証明書が生成されているようです。
別に証明書を用意して、それをセットするには、Proxy - Option - Import / export CA certificateのメニューを使用します。
試験用のオレオレ証明書の作成方法などについては、下記をご参照ください。
OpenSSL Certificate Authority - Create the root pair
開かれたダイアログでImport側にチェックを入れて、証明書をインポートします。
10 最後に
今回、Burp Suiteでプロキシーを構成し、アプリの通信をモニターする要領を紹介しました。 通信の暗号化が、ほとんど常識となっている今では、SSL通信をモニターする環境を準備しておく事は重要だと思います。
11 参考資料
https://portswigger.net/index.html
不正なSSL証明書を見破るPublic Key Pinningを試すAdd Starboyasanmkt
Burp and iOS 9 App Transport Security